package javabase.collection.list.serializable;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

/**声明为transient，为什么还可以序列化成功呢?
 * ArrayList是会开辟多余空间来保存数据的，而系列化和反序列化这些没有存放数据的空间是要消耗更多资源的，
 * 所以ArrayList的数组就声明为transient，告诉虚拟机这个你别管，我自己来处理，
 * 然后就自己实现write/readObject方法，仅仅系列化已经存放的数据。
 */

/**
 * @author liuzq
 *	数组序列化时，不管是否有值，都会将整个数组序列化到文件中
 */
public class ArrayListSerial {
	public static void main(String[] args) {
		
		File file = new File("list.out");

        ObjectOutputStream oout = null;
		try {
			oout = new ObjectOutputStream(new FileOutputStream(file));
			List<String> list = new ArrayList<String>() {
				private static final long serialVersionUID = 1L;
				{
					add("社会");
					add("主义");
					add("好!");
				}
			};
			oout.writeObject(list);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (oout != null) {
				try {
					oout.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
  
        ObjectInputStream oin = null;
		try {
			oin = new ObjectInputStream(new FileInputStream(file));
			Object vector = oin.readObject(); 
			System.out.println(vector);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}  catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				oin.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}
